package com.xunshibao.action.oauth;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import com.xunshibao.util.DateUtil;
import com.xunshibao.util.StringEncryptor;

public class OAuthHelper {
	/**
	 * 验证人人网链接登录时用户的有效性 验证Cookie<br/>
	 * 1. 把“<API_KEY>_expires”对应的Cookie值与当前系统时间比较，如果小于当前系统时间，说明用户Session
	 * Key已经过期，即可判断验证失败，算法结束，否则，进行下一步验证；<br/>
	 * 2. 除了最后一项Cookie参数（即以“<API_KEY>”为key的那一项），将剩余的每一项参数写成“key=value”的形式；<br/>
	 * 3. 将每个key中的“<API_KEY>_”前缀去掉；<br/>
	 * 4. 将所有的“key=value”按key的字典顺序排序；<br/>
	 * 5. 按排好的顺序将所有“key=value”连接起来，构成一个字符串；<br/>
	 * 6. 字符串末尾追加App的Secret；<br/>
	 * 7. 计算最后字符串的MD5值；<br/>
	 * 8. 将计算出来的MD5值与Cookie里以“<API_KEY>”为key的那一项的Cookie值进行比较，如果相等则验证通过，否则验证失败<br/>
	 * 
	 * @param request
	 * @return
	 */
	public static boolean validRenRenLogin(HttpServletRequest request) {
		Cookie[] cookies = request.getCookies();
		String appkey = OAuthConfig.RENREN_APIKEY;
		String expireKey = appkey + "_expires";
		int expire = 0;
		String appkey1 = appkey + "_";
		String appkeyValue = null;
		List<String> cookieValues = new ArrayList<String>();
		for (Cookie c : cookies) {
			String cookieName = c.getName();
			if (cookieName.startsWith(appkey1)) {
				cookieValues.add(cookieName.replace(appkey1, "") + "=" + c.getValue());
			} else if (appkey.equals(cookieName)) {
				appkeyValue = c.getValue();
			} else if (expireKey.equals(cookieName)) {
				expire = Integer.parseInt(c.getValue());
			}
		}
		// 把“<API_KEY>_expires”对应的Cookie值与当前系统时间比较，如果小于当前系统时间，说明用户Session
		// Key已经过期，即可判断验证失败，算法结束，否则，进行下一步验证；
		int now = DateUtil.getNow();
		if (now > expire) {
			return false;
		}
		Collections.sort(cookieValues);

		StringBuilder sb = new StringBuilder();
		for (String cv : cookieValues) {
			sb.append(cv);
		}

		sb.append(OAuthConfig.RENREN_SECRETKEY);

		String md5 = StringEncryptor.md5(sb.toString());
		if (appkeyValue != null) {
			return appkeyValue.equals(md5);
		}

		return false;

	}
}
